#ifndef __BOOTLOADER_H__
#define __BOOTLOADER_H__   

#include "CPUFlash.h"  //flash write read function
#include "fatfs.h"  //get the bin file
#include "crc.h"   // 用于检验固件的crc是否正确
#include "stdio.h"
#include "stdint.h"
#include "SampleUI.h"

#define APP_START_ADDRESS       CPU_FLASH_START_ADDR  //CPUFlash可写范围全部作为APP使用
#define APP_MAX_SIZE_KB         CPU_FLASH_WR_SIZE    //CPUFlash可写范围全部作为APP使用
#define APP_VERSION_ADD_OFFSET  (7*4)           //起始地址偏移7个字为固件版本号
//BLT调试输出函数
#define TER_LOG_WITHOUT_NEWLINE(fmt, ...)   SampleUI_Print(fmt,##__VA_ARGS__) //OLED显示台打印
#define TER_LOG_INFO(fmt, ...)              SampleUI_Print(fmt"\n",##__VA_ARGS__) //OLED显示台打印
#define TER_LOG_BACKSPACE(x)                SampleUI_BackSpace(x)                 //OLED显示台退格函数 
#define BLT_LOG_INFO(fmt, ...)              printf("[BootLoader.c|%d] "fmt"\r\n",__LINE__,##__VA_ARGS__)
// #define BLT_LOG_INFO(fmt, ...)  
/* 开关全局中断的宏 */
#define ENABLE_INT()	__set_PRIMASK(0)	/* 使能全局中断 */
#define DISABLE_INT()	__set_PRIMASK(1)	/* 禁止全局中断 */

typedef struct
{
    FIL app_file;                           //文件对象
    char* bin_path;                         //文件路径
    uint32_t bin_crc;                       //固件CRC
    uint32_t bin_cal_crc;                   //固件计算出的CRC，可用于校验
    uint32_t bin_size;                      //固件大小
    uint32_t bin_version;                   //固件版本号
    FRESULT (*fs_built)(void);                 //文件系统对象的初始化函数
    FRESULT (*fs_destruct)(void);              //文件系统对象的析构函数
} BLTAppFile; //Bootloader要加载的app文件对象 

void BLT_JumpToApp(void(*DeInitFunc)(uint8_t para),uint8_t para);
FRESULT BLT_GetAppInfo(BLTAppFile *p_app_file);
FRESULT BLT_GetAppCRC(BLTAppFile *p_app_file);
FRESULT BLT_LoadApp(BLTAppFile *p_app_file);
uint8_t BLT_APP_Is_Exist(void);



#endif

